home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsREPORT.rexx < prev    next >
OS/2 REXX Batch file  |  1995-04-25  |  12KB  |  427 lines

  1. /*         $VER: bbsREPORT.rexx 8.5 (25.4.95)
  2. copyright 1991-95 Richard Lee Stockton FREELY DISTRIBUTABLE
  3.   
  4.                - reports user inactivity -
  5.        - any user who hasn't called for 365 days -
  6.    - less than 3 calls with last older than 270 days -
  7.        - only 1 call made more than 180 days ago -
  8.      - CHANGE THESE LIMITS IF YOU DON'T LIKE THEM! -
  9.          - also will report filelist problems -
  10. */
  11.  
  12. HOW_MANY=100    /* how many old files to put on report */
  13. MIN_DAYS=30     /* don't report files younger than this (in days) */
  14.  
  15. PARSE SOURCE . . . prg .
  16. ADDRESS AREXX Increment.rexx prg
  17.  
  18. CALL TIME('R')
  19. least.=999999999999
  20. CALL PRAGMA('P',-2)
  21. SIGNAL ON ERROR
  22. SIGNAL ON SYNTAX
  23. SIGNAL ON FAILURE
  24. NUMERIC DIGITS 14
  25.  
  26. ARG name what2do 
  27. temp=STRIP(WORD(what2do,WORDS(what2do)))
  28. IF DATATYPE(temp,'N') THEN SMALLEST=temp
  29. ELSE SMALLEST=0
  30.  
  31. figarg='s:CONFIG.BBS'
  32. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  33. x=OPEN(f,figarg,'R')
  34. IF x=0 THEN
  35.   DO
  36.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  37.     EXIT(20)
  38.   END
  39.  
  40. lynes.=''
  41. DO i=1 TO 8
  42.   lynes.i=READLN(f)
  43. END
  44. CALL CLOSE(f)
  45.  
  46. compos=POS('/*',lynes.1)
  47. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  48.  
  49. bbsname = STRIP(lynes.1)
  50. sysop   = UPPER(WORD(lynes.2,1))
  51. bbspath = WORD(lynes.6,1)
  52. IF ~EXISTS(bbspath) THEN
  53.   DO
  54.     SAY bbspath 'does not exist!'
  55.     EXIT(20)
  56.   END
  57. testchar=RIGHT(bbspath,1)
  58. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  59.  
  60. libpath            = WORD(lynes.8,1)
  61. IF ~EXISTS(libpath) THEN
  62.   DO
  63.     MSG libpath 'does not exist!'
  64.     EXIT(20)
  65.   END
  66. testchar=RIGHT(libpath,1)
  67. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  68.  
  69.  
  70. IF FIND(what2do,'USERS')=0 THEN SIGNAL FILEREPORT
  71.  
  72. inarg=bbspath'EMail/'name'/INACTIVE_USERS'
  73. CALL CLOSE(STDOUT)
  74. CALL OPEN(STDOUT,inarg,'W')
  75. IF x=0 THEN
  76.   DO
  77.     SAY inarg 'would not open for writing!'
  78.     EXIT(20)
  79.   END
  80.  
  81. userlist=SHOWDIR(bbspath'Users','F')
  82. x=FIND(userlist,sysop)
  83. IF x>0 THEN userlist=DELWORD(userlist,x,1)
  84. SAY LEFT('USER_NAME',28)'days last_session calls location'
  85. ndate=DATE('I')
  86. ten=0
  87. thirty=0
  88. ninty=0
  89. sixmo=0
  90. DO i=1 TO WORDS(userlist)
  91.   thisuser=WORD(userlist,i)
  92.   x=OPEN(f,bbspath'Users/'thisuser,'R')
  93.   IF x=0 THEN
  94.     DO
  95.       SAY thisuser 'userfile would not open!'
  96.       ITERATE i
  97.     END
  98.   lynes.=''
  99.   DO j=1 TO 23
  100.     line=READLN(f)
  101.     IF EOF(f) THEN LEAVE j
  102.     lynes.j=line
  103.   END
  104.   CALL CLOSE(f)
  105.   idate=0
  106.   add2list=0
  107.   IF DATATYPE(WORD(lynes.13,1),'N') THEN
  108.     DO
  109.       idate=DATE('I',STRIP(WORD(lynes.13,1)),'S')
  110.       age=ndate-idate
  111.       IF age<11 THEN ten=ten+1
  112.       IF age<31 THEN thirty=thirty+1
  113.       IF age<91 THEN ninty=ninty+1
  114.       IF age<183 THEN sixmo=sixmo+1
  115.       IF FIND(lynes.21,'VIP_USER')>0 THEN NOP
  116.       ELSE IF (idate+365)<ndate THEN add2list=365
  117.       ELSE IF WORD(lynes.19,6)<4 & (idate+270)<ndate THEN add2list=270
  118.       ELSE IF WORD(lynes.19,6)<2 & (idate+180)<ndate THEN add2list=180
  119.       IF add2list>0 THEN
  120.         DO
  121.           line=LEFT(thisuser,28) RIGHT(add2list,3)'  'DATE(,WORD(lynes.13,1),'S')
  122.           line=line'  'WORD(lynes.19,6)'  'lynes.3
  123.           SAY line
  124.         END
  125.     END
  126.   ELSE SAY 'Bad Date!' thisuser lynes.13
  127. END
  128. SAY
  129. SAY RIGHT(WORDS(userlist),5) 'users.'
  130. SAY RIGHT(sixmo,5) 'of these users have called within the last 6 months.'
  131. SAY RIGHT(ninty,5) 'of these users have called within the last 90 days.'
  132. SAY RIGHT(thirty,5) 'of these users have called within the last 30 days.'
  133. SAY RIGHT(ten,5) 'of these users have called within the last 10 days.'
  134. SAY
  135. t=(.5+TIME('E'))%1
  136. min=t%60
  137. hrs=min%60
  138. min=min//60
  139. secs=t//60
  140. temp=' - It took'
  141. IF hrs>1 THEN temp=temp hrs 'hours'
  142. ELSE IF hrs=1 THEN temp=temp '1 hour'
  143. IF min>1 THEN temp=temp min 'minutes'
  144. ELSE IF min=1 THEN temp=temp '1 minute'
  145. IF secs=1 THEN temp=temp '1 second'
  146. ELSE IF secs>0 THEN temp=temp secs 'seconds'
  147. temp=temp 'to compile this report -'
  148. SAY temp
  149. SAY
  150. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  151.   CALL SETCLIP('BBS_MESSAGE','INACTIVE_USERS report is waiting in Email.')
  152. CALL TIME('R')
  153.  
  154.  
  155.  
  156. FILEREPORT:
  157. IF FIND(what2do,'FILES')=0 THEN EXIT(0)
  158.  
  159. inarg=bbspath'EMail/'name'/FILELISTS_REPORT'
  160. CALL CLOSE(STDOUT)
  161. CALL OPEN(STDOUT,inarg,'W')
  162. IF x=0 THEN
  163.   DO
  164.     SAY inarg 'would not open for writing!'
  165.     EXIT(20)
  166.   END
  167.  
  168. SAY ' - FileReport -' DATE('W')'  'DATE()'  'TIME('C')
  169. SAY LEFT('-',75,'-')
  170.  
  171. dirs.='0000000'
  172. IF readopen(bbspath'Lists/Libraries') THEN
  173.   DO
  174.     DO i=1
  175.       line=READLN(f)
  176.       IF line='END' | EOF(f) THEN LEAVE i
  177.       num=WORD(line,1)
  178.       IF DATATYPE(num,'N') THEN dirs.num=STRIP(WORD(line,2))
  179.     END
  180.     CALL CLOSE(f)
  181.   END
  182.  
  183. problem=0
  184. IF readopen(bbspath'Lists/Files') THEN
  185.   DO
  186.     DO i=1
  187.       line=READLN(f)
  188.       IF EOF(f) THEN BREAK
  189.       listfile=libpath||COMPRESS(WORD(line,2)'/'WORD(line,3),' ')
  190.       IF EXISTS(listfile) THEN ITERATE i
  191.       link=STATEF(bbspath'FileNotes/'COMPRESS(WORD(line,2)'/'WORD(line,3)))
  192.       link=WORD(link,8)
  193.       realfile=listfile
  194.       IF link~='' THEN realfile=link
  195.       IF EXISTS(realfile) THEN ITERATE i
  196.       temp=listfile
  197.       IF temp~=realfile THEN temp=temp '('realfile')'
  198.       SAY temp 'does not exist!'
  199.       problem=1
  200.     END
  201.     CALL CLOSE(f)
  202.     devs.0=di
  203.   END
  204. IF ~problem THEN SAY 'All files in the master list exist as links or in the libraries.'
  205. ELSE SAY 'The above files in the master list are not available for downloading!'
  206. SAY i-1 'files listed in ''Lists/Files''.'
  207. xlist='.JPG .GIF .LHA .LZH .ARC .ZOO .ZIP .RUN .EXE .PAK .LHW .LZX'
  208. xlist=xlist '.ARJ .WRP .ZOM .DMS .CPT .SEA .SIT .TXT .MPG .JPE JPEG'
  209. k=0
  210. kk=0
  211. devs.=0
  212. devlist=UPPER(LEFT(libpath,POS(':',libpath)-1))
  213. DO i=1 TO 99
  214.   IF dirs.i='' | dirs.i='0000000' THEN ITERATE i
  215.   realfiles=SHOWDIR(libpath||dirs.i)
  216.   k=k+WORDS(realfiles)
  217.   DO j=1 TO WORDS(realfiles)
  218.     DO
  219.       file=dirs.i'/'STRIP(WORD(realfiles,j))
  220.       IF ~EXISTS(bbspath'FileNotes/'file) THEN
  221.         SAY 'No file description for' file WORD(STATEF(libpath||file),2) 'bytes.'
  222.     END
  223.   END
  224.   notes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  225.   DO j=1 TO WORDS(notes)
  226.     thisnote=bbspath'FileNotes/'dirs.i'/'STRIP(WORD(notes,j))
  227.     x=OPEN(f,thisnote,'R')
  228.     IF x=0 THEN ITERATE j
  229.     line1=READLN(f)
  230.     line2=READLN(f)
  231.     line3=READLN(f)
  232.     CALL CLOSE(f)
  233.     kk=kk+1
  234.     di=1
  235.     IF ~EXISTS(libpath||dirs.i'/'STRIP(WORD(notes,j))) THEN
  236.       DO
  237.         link=WORD(STATEF(thisnote),8)
  238.         IF link='' THEN ITERATE j
  239.         ELSE
  240.           DO
  241.             IF EXISTS(link) THEN
  242.               DO
  243.                 k=k+1
  244.                 x=POS(':',link)
  245.                 IF x>2 THEN
  246.                   DO
  247.                     dev=UPPER(LEFT(link,x-1))
  248.                     di=FIND(devlist,dev)
  249.                     IF di=0 THEN
  250.                       DO
  251.                         devlist=devlist dev
  252.                         di=WORDS(devlist)
  253.                       END
  254.                   END
  255.               END
  256.             ELSE ITERATE j
  257.           END
  258.       END
  259.     filenum=WORD(line1,2)
  260.     IF FIND(xlist,UPPER(RIGHT(thisnote,4)))=0 & LEFT(WORD(notes,j),1)~='.' THEN
  261.       SAY 'File' filenum WORD(notes,j) 'in' dirs.i 'may be unarchived.'
  262.     nname=WORD(line2,2)
  263.     size=WORD(line2,4)
  264.     dlds=WORD(line2,7)
  265.     dirs.i.1=dirs.i.1+1      /*  files this dir */
  266.     dirs.i.2=dirs.i.2+size   /*  bytes this dir */
  267.     dirs.i.3=dirs.i.3+dlds   /* dloads this dir */
  268.     devs.di.1=devs.di.1+1    /*  files this device */
  269.     devs.di.2=devs.di.2+size /*  bytes this device */
  270.     devs.di.3=devs.di.3+dlds /* dloads this device */
  271.     IF size<SMALLEST | SMALLEST<0 THEN ITERATE j
  272.     uldate=norm2seq(SUBWORD(line3,4,3))
  273.     IF uldate<19780000 | uldate>99991231 THEN
  274.       DO
  275.         SAY 'Bad Date! 'SUBWORD(line3,4,3) thisnote
  276.         ITERATE j
  277.       END
  278.     IF DATE('I',uldate,'S')>(DATE('I')-MIN_DAYS) THEN ITERATE j
  279.     DO jj=HOW_MANY TO 1 BY -1
  280.       IF dlds>least.jj THEN ITERATE j
  281.       IF dlds=least.jj & uldate>least.jj.0 THEN ITERATE j
  282.       jjj=jj+1
  283.       least.jjj=least.jj
  284.       least.jjj.0=least.jj.0
  285.       least.jjj.1=least.jj.1
  286.       least.jj=dlds
  287.       least.jj.0=uldate
  288.       least.jj.1=RIGHT(size,8) RIGHT(filenum,6) LEFT(dirs.i,16) nname
  289.     END
  290.   END
  291. END
  292.  
  293. SAY kk 'filenotes.'
  294. SAY k 'actual files in libraries.'
  295.  
  296. IF readopen(bbspath'Lists/Files.ALPHA') THEN
  297.   DO
  298.     DO i=1
  299.       line=READLN(f)
  300.       IF EOF(f) THEN BREAK
  301.     END
  302.     CALL CLOSE(f)
  303.   END
  304. SAY i-1 'files listed in ''Lists/Files.ALPHA''.'
  305. SAY
  306. IF SMALLEST~<0 THEN
  307.   DO
  308.     SAY ' - The 'HOW_MANY' least downloaded, oldest files greater -'
  309.     SAY ' - than' comma(SMALLEST) 'byte(s) in the current libraries -'
  310.     SAY RIGHT('dls',5) LEFT('Date',11) RIGHT('Bytes',8) 'File #' LEFT('Library',16) 'Filename'
  311.     SAY LEFT('-',62,'-')
  312.     DO i=1 TO HOW_MANY
  313.       IF least.i>99991231 THEN ITERATE i
  314.       SAY RIGHT(least.i,5) DATE(,least.i.0,'S') least.i.1
  315.     END
  316.     SAY
  317.   END
  318. SAY ' - LIBRARY STATISTICS -'
  319. SAY RIGHT('Lib#',4) LEFT('Library Name',16) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  320. SAY LEFT('-',72,'-')
  321. tots.=0
  322. DO i=1 TO 99
  323.   IF dirs.i='' | dirs.i=0 THEN ITERATE i
  324.   DO j=1 TO 3
  325.     tots.j=tots.j+dirs.i.j
  326.   END
  327.   temp=dirs.i.1
  328.   IF temp<1 THEN temp=1
  329.   SAY RIGHT(i,4) LEFT(dirs.i,16) RIGHT(comma(dirs.i.1),5) RIGHT(comma(dirs.i.2),14) RIGHT(comma(dirs.i.3),9) RIGHT(comma((.5+dirs.i.2/temp)%1),11) RIGHT(TRUNC(dirs.i.3/temp,2),7)
  330. END
  331. SAY
  332. SAY LEFT('',21) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  333. SAY LEFT('-',72,'-')
  334. x=WORDS(devlist)
  335. IF x>1 THEN
  336.   DO
  337.     DO i=1 TO x
  338.       temp=devs.i.1
  339.       IF temp<1 THEN temp=1
  340.       SAY RIGHT(WORD(devlist,i)':',21) RIGHT(comma(devs.i.1),5) RIGHT(comma(devs.i.2),14) RIGHT(comma(devs.i.3),9) RIGHT(comma((.5+devs.i.2/temp)%1),11) RIGHT(TRUNC(devs.i.3/temp,2),7)
  341.     END
  342.     SAY LEFT('-',72,'-')
  343.   END
  344. temp=tots.1
  345. IF temp<1 THEN temp=1
  346. SAY RIGHT('TOTALS:',21) RIGHT(comma(tots.1),5) RIGHT(comma(tots.2),14) RIGHT(comma(tots.3),9) RIGHT(comma((.5+tots.2/temp)%1),11) RIGHT(TRUNC(tots.3/temp,2),7)
  347. SAY
  348. t=(.5+TIME('E'))%1
  349. min=t%60
  350. hrs=min%60
  351. min=min//60
  352. secs=t//60
  353. temp=' - It took'
  354. IF hrs>1 THEN temp=temp hrs 'hours'
  355. ELSE IF hrs=1 THEN temp=temp '1 hour'
  356. IF min>1 THEN temp=temp min 'minutes'
  357. ELSE IF min=1 THEN temp=temp '1 minute'
  358. IF secs=1 THEN temp=temp '1 second'
  359. ELSE IF secs>0 THEN temp=temp secs 'seconds'
  360. temp=temp 'to compile this report -'
  361. SAY temp
  362. SAY
  363. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  364.   CALL SETCLIP('BBS_MESSAGE','FILELISTS_REPORT is waiting in Email.')
  365. EXIT(0);
  366.  
  367.  
  368. readopen:
  369. PARSE ARG fname
  370. ok=OPEN(f,fname,'R')
  371. IF ok~=0 THEN RETURN(1)
  372. line=fname 'failed to open for reading!'
  373. SAY line
  374. RETURN(0)
  375.  
  376.  
  377. norm2seq:     /* takes '3 Jan 1990' and turns it into '19900103' */
  378. ARG da' 'mo' 'yr .
  379. da=da/1
  380. mo=STRIP(mo)
  381. yr=yr/1
  382. IF da<10 THEN da='0'da
  383. SELECT
  384.   WHEN mo='JAN' THEN mo='01'
  385.   WHEN mo='FEB' THEN mo='02'
  386.   WHEN mo='MAR' THEN mo='03'
  387.   WHEN mo='APR' THEN mo='04'
  388.   WHEN mo='MAY' THEN mo='05'
  389.   WHEN mo='JUN' THEN mo='06'
  390.   WHEN mo='JUL' THEN mo='07'
  391.   WHEN mo='AUG' THEN mo='08'
  392.   WHEN mo='SEP' THEN mo='09'
  393.   WHEN mo='OCT' THEN mo='10'
  394.   WHEN mo='NOV' THEN mo='11'
  395.   WHEN mo='DEC' THEN mo='12'
  396.   OTHERWISE RETURN(-1);
  397. END
  398. RETURN(yr||mo||da);
  399.  
  400.  
  401. comma: PROCEDURE
  402. ARG num .
  403. num=num%1
  404. dgt=LENGTH(num)
  405. numtext=''
  406. IF dgt>3 THEN numtext=','RIGHT(num,3)
  407. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  408. IF dgt>9 THEN
  409.   DO
  410.     numtext=','LEFT(RIGHT(num,9),3)||numtext
  411.     numtext=LEFT(num,dgt-9)||numtext
  412.   END
  413. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  414. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  415. ELSE numtext=num
  416. RETURN(numtext)
  417.  
  418.  
  419. SYNTAX:
  420. FAILURE:
  421. ERROR:
  422. SAY 'Line:' SIGL ERRORTEXT(RC)
  423. SAY
  424. EXIT;
  425.  
  426. /* end of bbsREPORT.rexx */
  427.